/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uca.sisbec.helpers.manto;

import com.uca.sisbec.beans.LibroDevolucionBean;
import com.uca.sisbec.beans.LibroPrestamoBean;
import com.uca.sisbec.commons.Utils;
import com.uca.sisbec.forms.becario.PrestamoLibroForm;
import com.uca.sisbec.forms.manto.LibrosForm;
import com.uca.sisbec.mapping.Libro;
import com.uca.sisbec.mapping.Prestamo;
import com.uca.sisbec.mapping.PrestamoId;
import java.sql.SQLException;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Criteria;
import org.hibernate.Query;
import java.util.List;
import org.hibernate.criterion.Expression;
/**
 *
 * @author Jorgore
 */
public class LibroHelper {
    private Session session;
    
    
    public LibroHelper(Session session){
        this.session=session;
    }
    
    public void InsertarLibroBD(LibrosForm lf) throws SQLException, HibernateException{
        Libro libro = new Libro();
        libro.setIsbn(lf.getIsbn().toUpperCase());
        libro.setAutor(lf.getAutor());
        libro.setTitulo(lf.getTitulo());
        libro.setCategoria(lf.getCategoria());
        libro.setUnidades(lf.getUnidad());
        libro.setDisponibles(lf.getDisponible());
        session.save(libro);
    }
    
    public List<Libro> getLibroList(/*LibrosForm lf*/) throws 
            SQLException, HibernateException{
        
        List<Libro> listLibro = null;
        /*String cad = "select * from Libro;";*/
        Criteria crit = session.createCriteria(Libro.class);
        listLibro = crit.list();
        return listLibro;
    
    }
    
    public List<Libro> getbusquedaLibroList(LibrosForm lf)throws SQLException,
            HibernateException{
        List<Libro> listLib = null;
        Criteria crit = session.createCriteria(Libro.class)
                .add(Expression.conjunction()
                .add(Expression.like("isbn","%"+lf.getIsbn()+"%"))
                .add(Expression.like("titulo", "%"+lf.getTitulo()+"%"))
                .add(Expression.like("autor","%"+lf.getAutor()+"%"))
                .add(Expression.like("categoria", "%"+lf.getCategoria()+"%")));
        listLib = crit.list();
        return listLib;
    }
    
    public String getElementoBD(String elemento, String hql,String p_var) throws SQLException, HibernateException{
        String elem;
        Query query = session.createQuery(hql);
        query.setString(p_var, elemento);
        elem =(String)query.uniqueResult();
        return elem;
    }
    
    public boolean validLibro(String codigo){
        Libro libro = (Libro) session.get(Libro.class, codigo);
        return libro != null;
    }
    
    public int getEnteroBD(String elemento, String hql,String p_var) throws SQLException, HibernateException{
        String elem;
        int entero;
        Query query = session.createQuery(hql);
        query.setString(p_var, elemento);
        elem = query.uniqueResult().toString();
        entero =Integer.parseInt(elem);
        return entero;
       
    }
    public void eliminarLibroDB(LibrosForm lf){
        Libro l = (Libro)session.get(Libro.class, lf.getIsbn());
        session.delete(l);
    }
    
    public LibrosForm modificarLibroBD(LibrosForm lf){
        Libro libro = new Libro();
        libro.setIsbn(lf.getIsbn());
        libro.setTitulo(lf.getTitulo());
        libro.setAutor(lf.getAutor());
        libro.setCategoria(lf.getCategoria());
        libro.setUnidades(lf.getUnidad());
        libro.setDisponibles(lf.getDisponible());
        session.update(libro);
        return lf;
    }
    
    public void getLibroBD(LibrosForm form, String isbn){
        Libro libro = (Libro) session.get(Libro.class, isbn);
        form.setAutor(libro.getAutor());
        form.setCategoria(libro.getCategoria());
        form.setDisponible(libro.getDisponibles());
        form.setIsbn(isbn);
        form.setTitulo(libro.getTitulo());
        form.setUnidad(libro.getUnidades());
    }

    public boolean fillFormFromIsbn(PrestamoLibroForm plf) {
        Libro libro = (Libro) session.get(Libro.class, plf.getIsbnLibro());
        if (libro == null)
            return false;
        plf.setIsbn(libro.getIsbn());
        plf.setLibro(libro.getIsbn() + " - " + libro.getTitulo());
        return libro.getDisponibles() > 0 ? true : false;
    }

    public void registrarPrestamo(List<LibroPrestamoBean> libros, String carnet) {
        PrestamoId id;
        Prestamo p;
        Query query;
        String hql = "from Libro where isbn = :v_isbn";
        for (int i = 0; i < libros.size(); i++){
            id = new PrestamoId(carnet, libros.get(i).getIsbn());
            p = new Prestamo();
            p.setId(id);
            p.setFecPrestamo(Utils.getSqlDate(Utils.now()));
            p.setFecEntrega(Utils.getSqlDate(libros.get(i).getFecDevolucion()));
            session.save(p);
            query = session.createQuery(hql);
            query.setString("v_isbn", libros.get(i).getIsbn());
            Libro libro = (Libro) query.uniqueResult();
            libro.setDisponibles(libro.getDisponibles() - 1);
            session.update(libro);
        }
    }

    public boolean libroInBD(String isbn, String carnet) {
        String hql = "from Prestamo "
                + "where id.isbn = :v_isbn "
                + "and id.carnet = :v_carnet "
                + "and fecDevolucion is null ";
        Query query = session.createQuery(hql);
        query.setString("v_isbn", isbn);
        query.setString("v_carnet", carnet);
        Prestamo p = (Prestamo) query.uniqueResult();
        return (p != null);
    }

    public List<LibroDevolucionBean> getLibrosPrestados(String carnet) {
        String hql = "select new com.uca.sisbec.beans.LibroDevolucionBean "
                + "(p.id.idPrestamo, l.isbn, l.titulo, p.fecPrestamo, p.fecEntrega) "
                + "from Libro l, Prestamo p "
                + "where p.id.carnet = :v_carnet "
                + "and p.fecDevolucion is null "
                + "and p.id.isbn = l.isbn ";
        Query query = session.createQuery(hql);
        query.setString("v_carnet", carnet);
        List<LibroDevolucionBean> libros = new ArrayList<LibroDevolucionBean>(query.list());
        return libros;
    }

    public void cargarLibroDevForm(PrestamoLibroForm form) {
        String hql = "select id.isbn from Prestamo where id.idPrestamo = :v_idPrestamo";
        Query query = session.createQuery(hql);
        query.setInteger("v_idPrestamo", form.getPrestamo());
        String isbn = (String) query.uniqueResult();
        hql = "from Libro where isbn = :v_isbn";
        query = session.createQuery(hql);
        query.setString("v_isbn", isbn);
        Libro libro = (Libro) query.uniqueResult();
        form.setIsbn(libro.getIsbn());
        form.setLibro(libro.getTitulo());
    }

    public void devolverLibro(PrestamoLibroForm form) {
        String hql = "from Prestamo where id.idPrestamo = :v_idPrestamo";
        Query query = session.createQuery(hql);
        query.setInteger("v_idPrestamo", form.getPrestamo());
        Prestamo prestamo = (Prestamo) query.uniqueResult();
        prestamo.setFecDevolucion(Utils.getSqlDate(form.getFecDevolucion()));
        session.update(prestamo);
        hql = "from Libro where isbn = :v_isbn";
        query = session.createQuery(hql);
        query.setString("v_isbn", prestamo.getId().getIsbn());
        Libro libro = (Libro) query.uniqueResult();
        libro.setDisponibles(libro.getDisponibles() + 1);
        session.update(libro);
    }
    
}
